Linux开发

推荐列表 站点导航

当前位置:首页 > 服务器技术 > Linux开发 >

linux3.0-内核自带led驱动移植

来源:网络整理  作者:wy  发布时间:2020-12-24 01:20
cpu: s3c2440(arm9) Linux内核:linux-3.0 开发板:fl2440 开发模块:LED 前言:之前为了学习了解驱动的写法,所以编写与测试...

Linux内核:linux-3.0

开发板:fl2440

开发模块:LED

 

前言:之前为了学习了解驱动的写法,所以编写与测试过led驱动,然而linux3.0的内核已经有了这个led驱动,所以我们只需要使能移植到我们的fl2440开发板上即可

 

1.源码修改

查看fl2440开发板原理图,可知4个led分别是连接GPB5,GPB6.GPB8.GPB10这四个管脚,如图所示:

linux3.0-内核自带led驱动移植

所以我们需要在arch/arm/plat-s3c24xx/common-smdk.c文件中稍作修改,将led0~led3的相关GPIO分别配置成PB5,PB6,PB8,PB10

[zoulei@CentOS linux-3.0]$ vim arch/arm/plat-s3c24xx/common-smdk.c

48   

49 /IT之家 LED devices IT之家/  

50   

51 static struct s3c24xx_led_platdata smdk_pdata_led1 = {  

52         .gpio           = S3C2410_GPB(5),  

53         .flags          = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE,  

54         .name           = "led1",  

55         .def_trigger    = "timer",  

56 };  

57   

58 static struct s3c24xx_led_platdata smdk_pdata_led2 = {  

59         .gpio           = S3C2410_GPB(6),  

60         .flags          = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE,  

61         .name           = "led2",  

62         .def_trigger    = "nand-disk",  

63 };  

64   

65 static struct s3c24xx_led_platdata smdk_pdata_led3 = {  

66         .gpio           = S3C2410_GPB(8),  

67         .flags          = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE,  

68         .name           = "led3",  

69 };  

70   

71 static struct s3c24xx_led_platdata smdk_pdata_led4 = {  

72         .gpio           = S3C2410_GPB(10),  

73         .flags          = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE,  

74         .name           = "led4",  

75 };

#############################  

177   

178 void __init smdk_machine_init(void)  

179 {  

180         /IT之家 Configure the LEDs (even if we have no LED support)IT之家/  

181   

182         s3c_gpio_cfgpin(S3C2410_GPB(5), S3C2410_GPIO_OUTPUT);  

183         s3c_gpio_cfgpin(S3C2410_GPB(6), S3C2410_GPIO_OUTPUT);  

184         s3c_gpio_cfgpin(S3C2410_GPB(8), S3C2410_GPIO_OUTPUT);  

185         s3c_gpio_cfgpin(S3C2410_GPB(10), S3C2410_GPIO_OUTPUT);  

186   

187         s3c2410_gpio_setpin(S3C2410_GPB(5), 1);  

188         s3c2410_gpio_setpin(S3C2410_GPB(6), 1);  

189         s3c2410_gpio_setpin(S3C2410_GPB(8), 1);  

190         s3c2410_gpio_setpin(S3C2410_GPB(10), 1);

 

2.make menuconfig配置

[zoulei@CentOS linux-3.0]$ make menuconfig

Device drivers-->  

[IT之家]LED support-->  

[IT之家]LED Class support  

<IT之家>LED Support for Samsung S3C24XX GPIO LEDs /IT之家添加led支持IT之家/

完成上面的操作之后重新编译内核然后烧录到开发板,运行

 

3.下载到开发板测试

下载到内核之后会在/sys/class/目录下生成leds目录,在leds目录下会看到led0 led1 led2 led3四个LED的目录,这就是开发板上的四个LED.

linux3.0-内核自带led驱动移植

查看其中一个LED设备,如led1,可以看出led1当前的状态是关闭。其中brightness就是控制等亮灭的文件,(0表示关闭,1表示打开)

max_brightness可以控制亮灭程度的最大值假如设定是50就是0到50代表不同的亮度

linux3.0-内核自带led驱动移植

向brightness写1,表示打开LED。这时led1会被点亮。

向brightness写0,表示关闭LED。这时led1会被熄灭。

其他led也是同样的操作!

 

说明:对于向led这样的设备模型,系统认为所有的设备都是挂接在总线上的,而要使设备工作,就需要相应的驱动。设备模型会产生一个虚拟的文件系统——sysfs,它给用户提供了一个从用户空间去访问内核设备的方法,它在Linux里的路径是/sys。如果要写程序访问sysfs,可以像读写普通文件一样来操作/sys目录下的文件

 

代码测试:

led.c                                                                                                                      

/IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家 

IT之家      Copyright:  (C) 2017 zoulei 

IT之家                  All rights reserved. 

IT之家 

IT之家       Filename:  led.c 

IT之家    Description:  This file  

IT之家                  

IT之家        Version:  1.0.0(2017年04月20日) 

IT之家         Author:  zoulei <[email protected]

IT之家      ChangeLog:  1, Release initial version on "2017年04月20日 06时19分52秒" 

IT之家                  

IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家/  

#include<stdint.h>  

#include<string.h>  

#include<fcntl.h>  

#include<unistd.h>  

#include<stdio.h>  

#include<linux/input.h>  

#include<unistd.h>  

int main(int argc, char IT之家argv[])  

{  

int fd, no;  

no=(int)argv[1][3]-48;  /IT之家这么做的目的是得到运行./led_test led1(led2,led3,led4)on 命令时中的第二个参数中的数字1,2,3,4IT之家/  

switch(no)  

{  

case 1:  

fd = open("/sys/class/leds/led1/brightness", O_RDWR);  

break;  

case 2:  

fd = open("/sys/class/leds/led2/brightness", O_RDWR);  

break;  

case 3:  

fd = open("/sys/class/leds/led3/brightness", O_RDWR);  

break;  

case 4:  

fd = open("/sys/class/leds/led4/brightness", O_RDWR);  

break;  

default:  

return -1;  

}  

if(fd<0)  

{  

printf("can not open file.\n");  

return -1;  

}  

/IT之家完成打开或关闭LED操作IT之家/  

if(!strcmp(argv[2],"on"))  

write(fd, "1", 1);  

else if(!strcmp(argv[2],"off"))  

write(fd, "0", 1);  

close(fd);  

return 0;  

}  

 

将用交叉编译器编译之后下载到开发板上运行。

测试结果为:

linux3.0-内核自带led驱动移植

四个led灯成功点亮与熄灭。led驱动移植成功!

相关热词: Linux

本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!

本文地址: https://v30.fanwenzhu.com/server/kaifa/8400.shtml

相关文章
Copyright © www.juheyunku.com      关于 | 合作 | 声明 | 联系 | 更新 | 地图 | Tags

linux3.0-内核自带led驱动移植

2020-12-24 编辑:wy

Linux内核:linux-3.0

开发板:fl2440

开发模块:LED

 

前言:之前为了学习了解驱动的写法,所以编写与测试过led驱动,然而linux3.0的内核已经有了这个led驱动,所以我们只需要使能移植到我们的fl2440开发板上即可

 

1.源码修改

查看fl2440开发板原理图,可知4个led分别是连接GPB5,GPB6.GPB8.GPB10这四个管脚,如图所示:

linux3.0-内核自带led驱动移植

所以我们需要在arch/arm/plat-s3c24xx/common-smdk.c文件中稍作修改,将led0~led3的相关GPIO分别配置成PB5,PB6,PB8,PB10

[zoulei@CentOS linux-3.0]$ vim arch/arm/plat-s3c24xx/common-smdk.c

48   

49 /IT之家 LED devices IT之家/  

50   

51 static struct s3c24xx_led_platdata smdk_pdata_led1 = {  

52         .gpio           = S3C2410_GPB(5),  

53         .flags          = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE,  

54         .name           = "led1",  

55         .def_trigger    = "timer",  

56 };  

57   

58 static struct s3c24xx_led_platdata smdk_pdata_led2 = {  

59         .gpio           = S3C2410_GPB(6),  

60         .flags          = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE,  

61         .name           = "led2",  

62         .def_trigger    = "nand-disk",  

63 };  

64   

65 static struct s3c24xx_led_platdata smdk_pdata_led3 = {  

66         .gpio           = S3C2410_GPB(8),  

67         .flags          = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE,  

68         .name           = "led3",  

69 };  

70   

71 static struct s3c24xx_led_platdata smdk_pdata_led4 = {  

72         .gpio           = S3C2410_GPB(10),  

73         .flags          = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE,  

74         .name           = "led4",  

75 };

#############################  

177   

178 void __init smdk_machine_init(void)  

179 {  

180         /IT之家 Configure the LEDs (even if we have no LED support)IT之家/  

181   

182         s3c_gpio_cfgpin(S3C2410_GPB(5), S3C2410_GPIO_OUTPUT);  

183         s3c_gpio_cfgpin(S3C2410_GPB(6), S3C2410_GPIO_OUTPUT);  

184         s3c_gpio_cfgpin(S3C2410_GPB(8), S3C2410_GPIO_OUTPUT);  

185         s3c_gpio_cfgpin(S3C2410_GPB(10), S3C2410_GPIO_OUTPUT);  

186   

187         s3c2410_gpio_setpin(S3C2410_GPB(5), 1);  

188         s3c2410_gpio_setpin(S3C2410_GPB(6), 1);  

189         s3c2410_gpio_setpin(S3C2410_GPB(8), 1);  

190         s3c2410_gpio_setpin(S3C2410_GPB(10), 1);

 

2.make menuconfig配置

[zoulei@CentOS linux-3.0]$ make menuconfig

Device drivers-->  

[IT之家]LED support-->  

[IT之家]LED Class support  

<IT之家>LED Support for Samsung S3C24XX GPIO LEDs /IT之家添加led支持IT之家/

完成上面的操作之后重新编译内核然后烧录到开发板,运行

 

3.下载到开发板测试

下载到内核之后会在/sys/class/目录下生成leds目录,在leds目录下会看到led0 led1 led2 led3四个LED的目录,这就是开发板上的四个LED.

linux3.0-内核自带led驱动移植

查看其中一个LED设备,如led1,可以看出led1当前的状态是关闭。其中brightness就是控制等亮灭的文件,(0表示关闭,1表示打开)

max_brightness可以控制亮灭程度的最大值假如设定是50就是0到50代表不同的亮度

linux3.0-内核自带led驱动移植

向brightness写1,表示打开LED。这时led1会被点亮。

向brightness写0,表示关闭LED。这时led1会被熄灭。

其他led也是同样的操作!

 

说明:对于向led这样的设备模型,系统认为所有的设备都是挂接在总线上的,而要使设备工作,就需要相应的驱动。设备模型会产生一个虚拟的文件系统——sysfs,它给用户提供了一个从用户空间去访问内核设备的方法,它在Linux里的路径是/sys。如果要写程序访问sysfs,可以像读写普通文件一样来操作/sys目录下的文件

 

代码测试:

led.c                                                                                                                      

/IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家 

IT之家      Copyright:  (C) 2017 zoulei 

IT之家                  All rights reserved. 

IT之家 

IT之家       Filename:  led.c 

IT之家    Description:  This file  

IT之家                  

IT之家        Version:  1.0.0(2017年04月20日) 

IT之家         Author:  zoulei <[email protected]

IT之家      ChangeLog:  1, Release initial version on "2017年04月20日 06时19分52秒" 

IT之家                  

IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家/  

#include<stdint.h>  

#include<string.h>  

#include<fcntl.h>  

#include<unistd.h>  

#include<stdio.h>  

#include<linux/input.h>  

#include<unistd.h>  

int main(int argc, char IT之家argv[])  

{  

int fd, no;  

no=(int)argv[1][3]-48;  /IT之家这么做的目的是得到运行./led_test led1(led2,led3,led4)on 命令时中的第二个参数中的数字1,2,3,4IT之家/  

switch(no)  

{  

case 1:  

fd = open("/sys/class/leds/led1/brightness", O_RDWR);  

break;  

case 2:  

fd = open("/sys/class/leds/led2/brightness", O_RDWR);  

break;  

case 3:  

fd = open("/sys/class/leds/led3/brightness", O_RDWR);  

break;  

case 4:  

fd = open("/sys/class/leds/led4/brightness", O_RDWR);  

break;  

default:  

return -1;  

}  

if(fd<0)  

{  

printf("can not open file.\n");  

return -1;  

}  

/IT之家完成打开或关闭LED操作IT之家/  

if(!strcmp(argv[2],"on"))  

write(fd, "1", 1);  

else if(!strcmp(argv[2],"off"))  

write(fd, "0", 1);  

close(fd);  

return 0;  

}  

 

将用交叉编译器编译之后下载到开发板上运行。

测试结果为:

linux3.0-内核自带led驱动移植

四个led灯成功点亮与熄灭。led驱动移植成功!

本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供学习参考!
本文地址为 https://v30.fanwenzhu.com/server/kaifa/8400.shtml

相关文章

风云图片

推荐阅读

返回Linux开发频道首页